package main

import "fmt"

// // 非本地类型不能定义方法 
// // 给自定义类型添加方法
// type myInt int
// func (m myInt) PrintfInfo(){
// 	fmt.Println("我是自定义类型的自定义方法")
// }
// 结构体的匿名变量
// 匿名字段声明字段时没有字段名只有类型 没有名字的字段就称为匿名字段
// 匿名字段默认采用类型名作为字段名 结构体要求字段名称必须唯一 

// 结构体中的类型可以是一个切片 map 结构体
// type Person struct{
// 	Name string
// 	Age int
// 	Hobby []string
// 	map1 map[string]string
// }
// 结构体嵌套
// 关于父结构体中
// type User struct{
// 	Username string
// 	Password string
// 	// AddTime string
// 	Address 
// 	Email
// }
// type Address struct{
// 	Name string
// 	phone string
// 	Username string
// 	City string
// 	AddTime string
// }
// 	type Email struct{
// 		Account string
// 		AddTime string
// 	}

type Animal struct{
	Name string
}
func(a Animal) run(){
	fmt.Printf("%v 在运动\n",a.Name)
}
// 子结构体
type Dog struct{
	age int
	// 继承Animal
	Animal
}
func(d Dog) wangma(){
	fmt.Printf("%v 在旺旺\n",d.Name)
}
func main(){
	// 结构体实例化
	var d =Dog{
		age: 20,
		Animal: Animal{
			Name: "阿奇",
		},
	}
		d.run()
		d.wangma()
	}
	// var u User  //定义一个结构体变量
	// u.Username="itying"
	// u.Password="123456"
	// u.Address.Name="张三"
	// u.Address.phone="123456789"
	// u.Address.City="中国"
	// fmt.Printf("%#v",u)

	// 指定结构体
	// u.Email.AddTime="2025-05-01"
	
	// fmt.Printf("%v\n",u)

	// var p Person
	// p.Name="张三"
	// p.Age =20
	// // 先分配存储空间再赋值
	// p.Hobby =make([]string, 6,6)
	// p.Hobby[0]="写代码"
	// p.Hobby[1]="花花"
	// p.Hobby[2]="花花1"
	// p.map1 = make(map[string]string)
	// p.map1["address"]="北京"
	// p.map1["phone"]="123456789"
	// fmt.Printf("%v\n",p)
	// // 只想获取切片
	// fmt.Printf("爱好:%v",p.Hobby)
	// var a myInt =20
	// a.PrintfInfo()


	// 给任意类型添加方法

	// p1.setInfo("李四",34)
	// p1.PrintfInfo()
	// 	var p2=&Person{
	// 	"李四",
	// 	30,	
	// 	"男",
	// 	180,	
	// }
	// p2.PrintfInfo()
	// // 结构体实例化
	// var p1 Person //实例化Person结构体
	// p1.name="张三"
	// p1.age=20
	// p1.sex="男"
	// fmt.Printf("值:%v 类型:%T\n",p1,p1)
	// fmt.Printf("值:%#v 类型:%T",p1,p1)  //%#v打印类型和值

//可以使用new关键字实例化
	// var p2 =new(Person)
	// p2.Name="李四"
	// p2.age=20
	// p2.sex="男"
	// (*p2).Name="王五"
	// fmt.Printf("值:%#v 类型:%T",p2,p2) 

	// 第三种实例化
// 	var p3 =&Person{}
// 	p3.Name="招生"
// 	p3.age=23
// 	p3.sex="男"
// 	fmt.Printf("值:%#v 类型%T\n",p3,p3)

// 	// 第四种实例化

// 	var p4=Person{
// 		Name: "hha",
// 		age: 20,
// 		sex: "男",
// 	}
//   fmt.Printf("值:%#v 类型%T\n",p4,p4)

// //   类型是指针类型
//   var p5=&Person{
// 		Name: "wangma",
// 		age: 20,
// 		sex: "男",
// 	}
//   fmt.Printf("值:%#v 类型%T\n",p5,p5)

// //   key可以省略不写
//   var p6 =&Person{
// 	"王麻子",
// 	20,
// 	"男",
//   }
//   fmt.Printf("值:%#v 类型%T\n",p6,p6)
//   结构体是值类型

// 结构体方法和接收者
// func (接收者变量 接收者类型) 函数名
